package edu.cuit.avatar.common;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import lombok.extern.slf4j.Slf4j;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * JDBC助手类
 * @author <a href="mailto:1020zhaodan@163.com">Adan</a>
 * @version 1.0
 * @date 2025/7/25 9:52
 * @version 2.0
 */
@Slf4j
public class JdbcHelper {
//    //数据库驱动类
//    private static String driverClassName;
//    //登录数据库的url
//    private static String url;
//    //登录数据库的用户名
//    private static String username;
//    //登录数据库的密码
//    private static String password;

    //数据源
    private static DataSource dataSource;

    //该类的唯一实例
    private volatile static JdbcHelper instance;
    /**
     * 完成环境的初始化
     * 1. 驱动应该只注册一次且在系统启动时注册
     * 2. 加载配置信息
     */
    static {
        try {
            Properties prop = new Properties();
            prop.load(JdbcHelper.class.getClassLoader().getResourceAsStream("jdbc.properties"));
//            driverClassName = prop.getProperty("driverClassName");
//            url = prop.getProperty("url");
//            username = prop.getProperty("username");
//            password = prop.getProperty("password");
//            Class.forName(driverClassName);

            //对数据源进行初始化
            //dataSource = new DruidDataSource();
            // ((DruidDataSource)dataSource).setDriverClassName(driverClassName);
            // ((DruidDataSource)dataSource).setUrl(url);
            //....
            dataSource = DruidDataSourceFactory.createDataSource(prop); //只要properties的key和DruidDataSourceFactory数据源中属性名保持一致，会自动进行设置
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException(e);
        }
    }

    private JdbcHelper(){

    }
    /**
     * 获取指定数据库连接对象(连接会话)
     * @return Connection
     */
    public Connection getConnection(){
        try {
            //return DriverManager.getConnection(url, username, password); //直接获取物理连接
            //从数据源(连接池)中获取连接
            return dataSource.getConnection();
        } catch (SQLException e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException(e);
        }
    }

    /**
     * 释放连接
     * @param conn
     */
    public void free(Connection conn){
        try {
            if(conn != null)
                conn.close(); //数据源(连接池)中的连接已经重写了close():会将连接归还给连接池而不是物理关闭,交给连接池进行管理
        } catch (SQLException e) {
            log.error(e.getMessage(), e);
        }
    }

    /**
     * 对外返回该类的唯一实例
     */
    public static JdbcHelper getInstance(){
        if(instance == null){
            synchronized (JdbcHelper.class){
                if(instance == null)
                    instance = new JdbcHelper();
            }
        }
        return instance;
    }
}
